package com.qfoud.edu.dbutils.framwork.result.impl;

import com.qfoud.edu.dbutils.framwork.exception.DbutilsException;
import com.qfoud.edu.dbutils.framwork.result.base.RowProcessor;

import java.lang.reflect.Array;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 * @author xiaobobo
 * @title: BasicRowProcessor
 * @projectName cd-java-2303-project-parent
 * @description:
 * @date 2023/5/11  14:16
 */
public class BasicRowProcessor<T> implements RowProcessor<T> {

    //这一列数据的数据类型
    private Class clazz;

    public BasicRowProcessor(Class clazz){
       this.clazz=clazz;
    }

    public T[] handler(ResultSet resultSet) throws Exception{
        //申明一个容器将数据读出来
        List<T> tList=new ArrayList<T>();
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();
        if(columnCount!=1){
           throw new DbutilsException("列的数量不等于1和预期有误....");
        }
        //程序执行到这里 说明列的数量只有1是正确的
        //接下来遍历数
        while (resultSet.next()){
            tList.add((T)resultSet.getObject(1));
        }
        //程序执行到这里 说明数据已经添加到容器中去了....
        //要将上面的ArrayList转换成数组
        T[] ts=getTArray(clazz,tList.size());
        //接下来要将List中的数据放到数组中来
        for (int i = 0; i <tList.size() ; i++) {
            ts[i]=tList.get(i);
        }
        return ts;
    }

    /**
     * 在这个方法中我们要构建泛型数组
     * @param clazz
     * @return
     */
    private T[] getTArray(Class clazz,int length) {
        return (T[]) Array.newInstance(clazz,length);
    }
}
